package proxystatic;

import com.sun.org.glassfish.gmbal.ManagedObject;

/**
 * 静态代理
 *      事情：快乐结婚
 *      你要做的事情：1.婚礼前:布置现场   2.婚礼后：收拾现场
 *      1,2可以婚庆公司帮你干，婚庆公司就相当于你的代理，你不需要直接干，你告诉婚庆公司，公司来干
 * 静态代理总结;
 *      1.真实对象和代理对象都要实现同一个接口（同一个事情）
 *      2.代理对象要代理真实用户（你）
 *      3.线程底部实现原理：静态代理
 *
 */
public class StaticProxy {
    public static void main(String[] args) {
        // 你
        Person song = new Person();
        // 公司代理你结婚
        Company company = new Company(song);
        company.HapplyMarry();


        // 线程底部实现原理：静态代理
        // 对比：
        // Thread == 婚庆公司   Runnable == Person(you)   run == 同一接口
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("i love you");
            }
        }).start();
        new Company(new Person()).HapplyMarry();
    }

    /*
        婚礼前:布置现场
        大米要开心结婚了
        婚礼后：收拾现场
     */
}

// 结婚
interface Marry{
    void HapplyMarry();
}

// 人
class Person implements Marry{
    public void HapplyMarry() {
        System.out.println("大米要开心结婚了");
    }
}

// 婚庆公司
class Company implements Marry{
    private Marry target;

    public Company(Marry target) {
        this.target = target;
    }

    public void HapplyMarry() {
        before();
        this.target.HapplyMarry();
        after();
    }

    private void before() {
        System.out.println("婚礼前:布置现场");
    }

    private void after() {
        System.out.println("婚礼后：收拾现场");
    }
}
